package com.example.demo.service.aiService;

import com.example.demo.demo.invoke.DialogueState;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 会话服务，负责管理所有用户的对话状态。
 * 这个实现是基于内存的，适合开发和测试。
 * 生产环境请参考下方的建议，替换为基于Redis的实现。
 */
@Service
public class SessionService {

    // 使用 ConcurrentHashMap 在内存中存储用户的会话状态
    // Key: String (唯一的 sessionId)
    // Value: DialogueState (该用户的“对话病历”)
    private final Map<String, DialogueState> userSessions = new ConcurrentHashMap<>();

    /**
     * 根据 Session ID 获取用户的对话状态。
     * 如果是新用户，则为其创建一个全新的状态对象。
     * @param sessionId 唯一的用户会话ID
     * @return 用户的对话状态对象
     */
    public DialogueState getState(String sessionId) {
        // computeIfAbsent: 如果指定的key不存在，则执行lambda并存入Map，然后返回新值。
        // 这保证了每个sessionId只会被创建一次，是线程安全的。
        return userSessions.computeIfAbsent(sessionId, id -> new DialogueState());
    }

    /**
     * 保存（更新）用户的对话状态。
     * 在基于内存的实现中，因为对象是引用传递，此方法不是严格必需的。
     * 但在切换到Redis等外部存储时，显式保存是必需的，因此我们保留这个接口。
     * @param sessionId 唯一的用户会话ID
     * @param state 需要保存的状态对象
     */
    public void saveState(String sessionId, DialogueState state) {
        userSessions.put(sessionId, state);
    }
}